import { useAppSelector } from "@/modules/store";
import { FC } from "react";
import { Navigate, useLocation } from "react-router-dom";
import allRoutes, { IRouter } from "@/router";

/**
 * 递归查找当前路由配置
 * @param routes 路由配置数组
 * @param path 当前路径
 * @param isSecond 是否是二级路由
 * @returns 匹配的路由配置的requiredRole或空字符串
 */
const findRouteConfig = (routes: IRouter[], path: string, isSecond: boolean): string => {
  // 确保路径格式一致，移除尾部斜杠
  const normalizedPath = path.endsWith("/") ? path.slice(0, -1) : path;
  // 分割路由获取最后一段路径
  const pathSegments = normalizedPath.split('/');
  const endPath = pathSegments[pathSegments.length - 1];

  // 遍历路由配置
  for (const route of routes) {
    // 根据isSecond参数决定匹配逻辑
    if (isSecond) {
      // 二级路由匹配：直接比较路由的path与路径的最后一段
      if (route.path === endPath) {
        return route.meta.requiredRole;
      }
    } else {
      // 顶级路由匹配：比较完整路径
      // 处理带/和不带/的情况
      const routePath = route.path.startsWith('/') ? route.path : `/${route.path}`;
      if (routePath === normalizedPath || routePath === `/${normalizedPath}`) {
        return route.meta.requiredRole;
      }
    }

    // 如果当前路由有子路由，递归查找
    if (route.children && route.children.length > 0) {
      const childResult = findRouteConfig(route.children, isSecond ? endPath : normalizedPath, true);
      // 只有当子路由查找有结果时才返回
      if (childResult) {
        return childResult;
      }
    }
  }

  // 如果没有找到匹配的路由，返回空字符串
  return "";
};

/**
 * 高阶组件：为组件添加权限控制
 * 根据用户角色和路由配置的权限要求决定是否允许访问
 * @param WrappedComponent 需要被包装的组件
 * @returns 包装后的组件
 */
function withAuthorization(WrappedComponent: FC) {
  return () => {
    // 获取用户信息
    const { data } = useAppSelector((state) => state.user);
    let { name, role } = data || {};
    // 角色标准化：非admin角色统一视为user
    if (role !== "admin") {
      role = "user";
    }
    // 获取登录令牌
    const token = localStorage.getItem("HIST-token");
    // 获取当前路由地址
    const { pathname } = useLocation();
    // 获取当前路由配置和所需权限
    const requiredRole = findRouteConfig(allRoutes, pathname, false);
    // 权限控制逻辑
    if (token) {
      // 已登录状态
      if (pathname === "/login" || pathname === "/") {
        // 已登录用户访问登录页或根路径，重定向到首页
        return <Navigate to="/dashboard" />;
      }

      // 判断是否有用户数据
      if (name) {
        // 检查是否需要特定角色权限
        if (requiredRole && requiredRole !== role && requiredRole !== "user") {
          // 用户角色与路由要求的角色不匹配，重定向到403页面
          return <Navigate to="/result/403" replace />;
        }
        // 权限验证通过，渲染组件
        return <WrappedComponent />;
      }
      // 已登录但没有用户数据，可能是token有效但会话过期
      // 此处可以添加额外处理逻辑，如刷新用户数据
      return <Navigate to="/login" />;
    } else {
      // 未登录状态
      if (pathname === "/login") {
        // 允许访问登录页
        return <WrappedComponent />;
      }
      // 未登录访问其他页面，重定向到登录页
      return <Navigate to="/login" />;
    }
  };
}

export default withAuthorization;